import 'package:english_words/english_words.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    // ChangeNotifierProvider 创建状态并将其提供给整个应用。这样一来，应用中的任何 widget 都可以获取状态。
    return ChangeNotifierProvider(
      create: (context) => MyAppState(),
      child: MaterialApp(
        title: 'Namer App',
        theme: ThemeData(
          useMaterial3: true,
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),
        ),
        home: MyHomePage(),
      ),
    );
  }
}

// 定义应用的状态（管理应用状态）
// 定义应用运行所需的数据
// 状态类扩展 ChangeNotifier，这意味着它可以向其他人通知自己的更改。例如，如果当前单词对发生变化，应用中的一些 widget 需要知晓此变化。
class MyAppState extends ChangeNotifier {
  var current = WordPair.random();
  void getNext() {
    current = WordPair.random();
    // 通知所有监听器，状态已更改。向任何通过 watch 方法跟踪 MyAppState 的对象发出通知。
    notifyListeners();
  }
}

class MyHomePage extends StatelessWidget {
  @override
  // 每个 widget 均定义了一个 build() 方法，每当 widget 的环境发生变化时，系统都会自动调用该方法，以便 widget 始终保持最新状态。
  Widget build(BuildContext context) {
    // 使用 watch 方法跟踪对应用当前状态的更改。
    var appState = context.watch<MyAppState>();

    // 每个 build 方法都必须返回一个 widget 或（更常见的）嵌套 widget 树。在本例中，顶层 widget 是 Scaffold。
    return Scaffold(
      // Column 是 Flutter 中最基础的布局 widget 之一。它接受任意数量的子项并将这些子项从上到下放在一列中。默认情况下，该列会以可视化形式将其子项置于顶部。
      body: Column(
        children: [
          Text('A random AWESOME idea:'),
          // 第二个 Text widget 接受 appState，并访问该类的唯一成员 current（这是一个 WordPair）。WordPair 提供了一些有用的 getter，例如 asPascalCase 或 asSnakeCase。此处，我们使用了 asLowerCase。
          // Text(appState.current.asLowerCase), 修改appState的current
          Text(appState.current.asUpperCase),

          // ↓ Add this.
          ElevatedButton(
            onPressed: () {
              // print('button pressed!');
              appState.getNext();
            },
            child: Text('按钮'),
          ),

        ],  // 请注意，Flutter 代码大量使用了尾随逗号。此处并不需要这种特殊的逗号，但建议在 Flutter 中使用它们，因为它们可以减少代码中的错误。
      ),
    );
  }
}